const db = require('../db/index')
//导入bcrypt加密中间件
const bcrypt = require('bcrypt')
//导入jwt用于生成token
const jwt = require('jsonwebtoken')
//导入jwt配置文件，用于加密和解密
const jwtconfig = require('../jwt_config/index')

exports.register = (req, res) => {
  const reginfo = req.body;
  if (!reginfo.account || !reginfo.password) {
    return res.send({ status: 1, message: '账号或者密码不能为空' });
  }

  const sql = 'select * from users where account = ?';
  db.query(sql, reginfo.account, (err, results) => {
    // 添加错误处理
    if (err) {
      return res.send({ status: 1, message: '数据库查询错误', error: err.message });
    }

    if (results.length > 0) {
      return res.send({ status: 1, message: '账号已存在' });
    }

    // 加密密码
    reginfo.password = bcrypt.hashSync(reginfo.password, 10);

    const sql1 = 'insert into users set ?';
    const identity = '用户';
    const create_time = new Date(); // 修正拼写：create_tiem → create_time

    // 修正回调函数位置和拼写
    db.query(sql1, {
      account: reginfo.account,
      password: reginfo.password,
      identity,
      create_time, // 使用修正后的变量名
      status: 0
    }, (err, results) => { // 回调函数作为第三个参数
      if (err) {
        return res.send({
          status: 1,
          message: '注册失败',
          error: err.message
        });
      }

      // 修正拼写：offectedRows → affectedRows
      if (results.affectedRows !== 1) {
        return res.send({ status: 1, message: '注册失败' });
      }

      // 成功响应放在回调内部
      res.send({ status: 0, message: '注册账号成功' });
    }); // 回调结束
  });
};

exports.login = (req, res) => {
  const logininfo = req.body;
  const sql = 'select * from users where account = ?';

  db.query(sql, logininfo.account, (err, results) => {
    // 处理数据库错误
    if (err) {
      return res.cc(err.message || '数据库错误');
    }

    // 修正逻辑：找不到账号应该返回错误
    if (results.length !== 1) {
      return res.cc('账号不存在');
    }

    // 正确比较密码
    const passwordIsValid = bcrypt.compareSync(
      logininfo.password, // 用户输入的明文密码
      results[0].password // 数据库存储的哈希密码
    );

    if (!passwordIsValid) {
      return res.cc('密码错误');
    }

    if (results[0].status == 1) {
      return res.cc('账号被冻结');
    }

    // 创建用户对象 - 使用正确的字段名
    const user = {
      id: results[0].id,
      account: results[0].account,
      identity: results[0].identity,
      status: results[0].status,
      // 确保字段名与数据库一致
      create_time: results[0].create_time,
      update_time: results[0].update_time
    };

    // 生成token
    const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, {
      expiresIn: '12h'
    });

    res.send({
      user: user, // 返回用户信息
      status: 0,
      message: '登录成功',
      token: 'Bearer ' + tokenStr
    });
  });
};


// 导入邮件发送模块
const nodemailer = require('nodemailer');
// 导入验证码生成工具
const crypto = require('crypto');

// 邮件配置 - 修复SMTP服务器和发件人信息
const transporter = nodemailer.createTransport({
  host: 'smtp.163.com',
  port: 465,
  secure: true,
  auth: {
    user: 'web_lh18391735162@163.com',
    pass: 'VUykrUsmv5rQ7GUM' // 21:45左右使用的授权码
  },
  tls: {
    rejectUnauthorized: false,
    minVersion: 'TLSv1.2'
  },
  connectionTimeout: 5000
});

// 存储验证码（实际项目建议使用Redis）
const codeStore = new Map();

// 发送验证码
exports.sendVerificationCode = (req, res) => {
  const { account, email } = req.body;
  
  // 添加邮箱格式验证（移至此处）
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    return res.send({ status: 1, message: '请输入有效的邮箱地址' });
  }
  
  // 数据库查询验证账号邮箱匹配
  const sql = 'SELECT email FROM users WHERE account = ?';
  db.query(sql, [account], (err, results) => {
    console.log('数据库查询结果:', { account, results, email }); // 添加此行
    if (err) {
      return res.send({ status: 1, message: '数据库查询失败' });
    }
    if (results.length !== 1 || results[0].email !== email) {
      return res.send({ status: 1, message: '账号与邮箱不匹配' });
    }

    // 生成验证码逻辑
    const code = crypto.randomInt(100000, 999999).toString();
    // 存储验证码（设置5分钟过期）
    codeStore.set(account, { code, email, expire: Date.now() + 5 * 60 * 1000 });
    // 添加日志验证收件人邮箱
    console.log('发送验证码到邮箱:', email);
    // 发送邮件
    transporter.sendMail({
      from: '"密码重置" <web_lh18391735162@163.com>',
      to: email,
      subject: '账号安全验证通知', // 修改主题为更中性内容
      text: `尊敬的用户，您正在进行安全验证，验证码为: ${code}，5分钟内有效。如非本人操作，请忽略此邮件。` // 增加安全提示语
    }, (err) => {
      if (err) {
        console.error('邮件发送失败详情:', {
          error: err.message,
          code: err.code,
          response: err.response,
          stack: err.stack, // 添加堆栈信息
          time: new Date().toISOString()
        });
        return res.send({
          status: 1,
          message: '验证码发送失败: ' + err.message,
          errorDetails: {
            code: err.code,
            response: err.response ? err.response.toString() : null
          }
        });
      } else {
        console.log('邮件发送成功:', { messageId: info.messageId, to: email }); // 添加此行
        res.send({ status: 0, message: '验证码发送成功' });
      }
    });
  });
};

// 验证验证码 - 移到顶级作用域
exports.verifyCode = (req, res) => {
  const { account, code } = req.body;

  // 参数验证
  if (!account || !code) {
    return res.send({ status: 1, message: '账号和验证码不能为空' });
  }

  const stored = codeStore.get(account);
  if (!stored) {
    return res.send({ status: 1, message: '验证码不存在或已过期' });
  }

  // 验证码比对
  if (stored.code !== code) {
    return res.send({ status: 1, message: '验证码错误' });
  }

  // 过期检查
  if (Date.now() > stored.expire) {
    codeStore.delete(account);
    return res.send({ status: 1, message: '验证码已过期' });
  }

  res.send({ status: 0, message: '验证码验证成功' });
};

// 重置密码 - 移到顶级作用域
exports.resetPassword = (req, res) => {
  const { account, code, password } = req.body;

  // 检查必填参数
  if (!account || !code || !password) {
    return res.send({ status: 1, message: '账号、验证码和密码不能为空' });
  }

  // 新增验证码验证逻辑
  const stored = codeStore.get(account);
  if (!stored) {
    return res.send({ status: 1, message: '验证码不存在或已过期' });
  }
  if (stored.code !== code) {
    return res.send({ status: 1, message: '验证码错误' });
  }
  if (Date.now() > stored.expire) {
    codeStore.delete(account);
    return res.send({ status: 1, message: '验证码已过期' });
  }

  // 1. 加密新密码
  const hashedPassword = bcrypt.hashSync(password, 10);
  // 2. 更新数据库
  const sql = 'UPDATE users SET password = ? WHERE account = ?';
  db.query(sql, [hashedPassword, account], (err, results) => {
    if (err) return res.send({ status: 1, message: '密码重置失败' });
    if (results.affectedRows !== 1) return res.send({ status: 1, message: '账号不存在' });
    // 3. 清除验证码
    codeStore.delete(account);
    res.send({ status: 0, message: '密码重置成功' });
    logPasswordReset(account, true, req.ip);
  });
};

// 日志相关代码移到顶级作用域
const fs = require('fs');
const path = require('path');

const logPasswordReset = (account, success, ip) => {
  const logEntry = `${new Date().toISOString()} - Account: ${account}, Success: ${success}, IP: ${ip}
`;
  fs.appendFile(
    path.join(__dirname, '../logs/password-reset.log'),
    logEntry,
    (err) => err && console.error('日志写入失败:', err)
  );
};
